home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / REJECT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-18  |  5.2 KB  |  239 lines

  1. #include "global.h"
  2. #if defined(REJECT) || defined(TEST)
  3. #include "ctype.h"
  4. #ifndef TEST
  5. #include "commands.h"
  6. #include "proc.h"
  7. #endif
  8. #include "reject.h"
  9. #include "files.h"
  10.  
  11. #if !defined(_lint)
  12. static char _rcsid[] OPTIONAL = "$Id: reject.c,v 1.12 1997/08/19 01:19:22 root Exp root $";
  13. #endif
  14.  
  15. #ifdef TEST
  16. void kwait (void *v)
  17. {
  18. }
  19.  
  20. void
  21. rip(s)
  22. register char *s;
  23. {
  24.     register char *cp;
  25.  
  26.     while((cp = strchr(s,'\n')) != NULLCHAR || (cp = strchr(s,'\r')) != NULLCHAR)
  27.         *cp = '\0';
  28. }
  29.  
  30. #else
  31. extern int MbReject;
  32. #endif
  33.  
  34.  
  35. /* using the following format for REJECT.DAT
  36.  *
  37.  *  action is one of 'R'eject, 'H'old, or 'L'ocal hold
  38.  *       type from to  @bbs bid      max_size    action
  39.  *       B    *    *   *    *_AZGATE 0           R
  40.  */
  41.         
  42. int
  43. reject (cmdstr, rmtuser, xfwd)
  44. const char *cmdstr;
  45. int rmtuser;
  46. int xfwd;
  47. {
  48. register FILE *fp;
  49. char buf[80];
  50. char cmdbuf[80];
  51. const char *cmd[5];
  52. int cmdsize, datsize;
  53. int retval = REJ_NO;
  54. int k;
  55. char *cp, *usestr;
  56. int complex;
  57.  
  58.  
  59. #ifndef TEST
  60.     if (!MbReject)
  61.         return (retval);
  62. #if 0
  63.     tcmdprintf ("Reject checking enabled: '%s' (%d)!\n", cmdstr, rmtuser);
  64. #endif
  65. #endif
  66.     if ((fp = fopen (REJECTFile, READ_TEXT)) == NULLFILE)
  67.         return (retval);
  68.     strncpy (cmdbuf, cmdstr, 80);
  69.     cmd[0] = cmd[1] = cmd[2] = cmd[3] = cmd[4] = "*";
  70.     cmdsize = -1;
  71.     if (xfwd)    /* can only get bid from XFWD type */
  72.         cmd[4] = cmdbuf;
  73.     else {
  74.         switch (*cmdbuf)    {
  75.             case 'S':
  76.             case 's':
  77.                 /* can get all but cmdsize, though bid and from are optional */
  78.                 cp = strtok (cmdbuf," \t");
  79.                 if (!cp)
  80.                     return (retval);
  81.                 cp++;
  82.                 if (*cp)    {
  83.                     *cp = (char) toupper(*cp);
  84.                     cmd[0] = cp;                /* store type */
  85.                 } else
  86.                     cmd[0] = "P";
  87.                 cmd[2] = strtok (NULLCHAR," \t");    /* store to */
  88.                 if (cmd[2] == NULLCHAR)
  89.                     return REJ_NO;
  90.                 if ((cp = strchr (cmd[2], '@')) != NULLCHAR)    {
  91.                     *cp++ = 0;
  92.                     cmd[3] = cp;
  93.                 }
  94.                 cp = strtok (NULLCHAR," \t");
  95.                 if (cp && *cp == '@')    {
  96.                     cmd[3] = strtok (NULLCHAR," \t");
  97.                     if (cmd[3] == NULLCHAR)
  98.                         cmd[3] = cp + 1;
  99.                     cp = strtok (NULLCHAR," \t");
  100.                 }
  101.                 if (cp && *cp == '<')    {
  102.                     if (cp[1])    {
  103.                         cmd[1] = &cp[1];
  104.                     } else
  105.                         cmd[1] = strtok (NULLCHAR," \t");
  106.                     cp = strtok (NULLCHAR," \t");
  107.                 }
  108.                 if (cp && *cp == '$')    {
  109.                     if (cp[1])    {
  110.                         cmd[4] = &cp[1];
  111.                     } else
  112.                         cmd[4] = strtok (NULLCHAR," \t");
  113.                 }
  114.                 break;
  115.             case 'F':
  116.             case 'f':
  117.                 /* can get all parameters */
  118.                 cp = strtok (cmdbuf," \t");        /* eat this one */
  119.                 cmd[0] = strtok (NULLCHAR," \t");    /* store type */
  120.                 cmd[1] = strtok (NULLCHAR," \t");    /* store from */
  121.                 cmd[3] = strtok (NULLCHAR," \t");    /* store bbs */
  122.                 cmd[2] = strtok (NULLCHAR," \t");    /* store to */
  123.                 cmd[4] = strtok (NULLCHAR," \t");    /* store bid */
  124.                 cp = strtok (NULLCHAR," \t");        /* get size */
  125.                 cmdsize = (cp) ? atoi(cp): 0;        /* store size */
  126.                 break;
  127.             default:
  128.                 break;
  129.         }
  130.     }    
  131.     while (fgets (buf, sizeof (buf), fp) != NULLCHAR) {
  132.         kwait (NULL);
  133.         if(*buf == '#')        /* skip commented lines */
  134.             continue;
  135.         rip (buf);
  136.         if (!*buf)
  137.             continue;    /* skip blank lines */
  138.  
  139.         usestr = buf;
  140.         complex = 0;
  141.         for (k = 0; k < 5; k++)    {
  142.             if((cp = strtok (usestr," \t")) == NULLCHAR) /* get the this token */
  143.                 break;
  144.             usestr = NULLCHAR;
  145.  
  146.             if (xfwd && k != 4)    /* xfwd'ing only has the bid */
  147.                 continue;
  148.             /* if source is not "match all" (partial info), then check it */
  149.             if (strcmp (cmd[k], "*"))    {
  150.                 /* okay, if this is xfwd'ing (only a bid to check)
  151.                  * and the bid pattern is "*",
  152.                  * then we have NOT matched
  153.                  */
  154.                 if (xfwd && !strcmp(cp, "*"))
  155.                     break;
  156.                 if (!wildmat (cmd[k], cp, NULLCHARP))
  157.                     break;        /* no match */
  158.             } else {    /* matching w/ partial info */
  159.                 /* if entry's pattern not "*", skip */
  160.                 if (strcmp (cp, "*"))
  161.                     break;        /* no match */
  162.             }
  163.             if (k && strcmp (cp, "*"))
  164.                 complex = 1;
  165.         }
  166.         if (k != 5)
  167.             continue;
  168.  
  169.         if((cp = strtok (NULLCHAR," \t")) == NULLCHAR) /* get the sixth token */
  170.             continue;
  171.  
  172.         if (cmdsize == -1)    {
  173.             if (!complex)
  174.                 continue;
  175.         } else {
  176.             datsize = atoi (cp);
  177.             if (datsize > cmdsize)
  178.                 continue;        /* size okay */
  179.         }
  180.  
  181.         if((cp = strtok (NULLCHAR," \t")) == NULLCHAR) /* get the seventh token */
  182.             continue;
  183.  
  184.         switch (*cp)    {
  185.             case 'A':    retval = REJ_ACCEPT;
  186.                     break;
  187.             case 'R':    retval = REJ_REJECT;
  188.                     break;
  189.             case 'H':    retval = REJ_HOLD;
  190.                     break;
  191.             case 'L':    retval = REJ_LOCALHOLD;
  192.                     break;
  193.             case 'D':    retval = REJ_DEFER;
  194.                     break;
  195.             default:    /* leave return = REJ_NO */
  196.                     break;
  197.         }
  198.         if (rmtuser && retval == REJ_LOCALHOLD)
  199.             continue;
  200.         break;
  201.     }
  202.     (void) fclose (fp);
  203. #if 0
  204.     tcmdprintf ("reject returned: %d\n", retval);
  205. #endif
  206.     return (retval);
  207. }
  208.  
  209.  
  210. #ifdef  TEST
  211. extern char *gets();
  212.  
  213. main()
  214. {
  215. char pattern[80];
  216. char text[80];
  217.     
  218.     for ( ; ; )    {
  219.         printf ("Enter SEND string:  ");
  220.         if (gets(pattern) == NULL)
  221.             break;
  222.         if(text[0] == '\0')
  223.             /* Blank line; go back and get a new pattern. */
  224.             break;
  225.         printf("\nReject value: %d\n", reject (pattern));
  226.     }
  227.     exit(0);
  228. }
  229.  
  230. #undef TEST
  231. #define mallocw malloc
  232. #define strncmp strcasecmp
  233.  
  234. #include "wildmat.c"
  235.  
  236. #endif  /* TEST */
  237.  
  238. #endif    /* REJECT || TEST */
  239.